C# Job Systemを使ったUnity流マルチスレッドプログラミングの話
概要
CEDEC2017 マルチスレッドで動かすための書き方 + コンパイラオプションのはなし。
DataOrientedProgramming
データ構造を分離してぶん投げる
MonoBehaviour -> structMonoBehaviourみたいなのを作った
JobComponentSysytemを実装
GCなし
NativeArrayの導入
うおーーーNativeArray入ってるのか
var src = new NativeArray<float>(500, Allocator.Temp);
src.Dispose();
安全
エラーで指摘してくれる
例えば依存した順番のジョブを順番指定なしで実行すると、依存書けよってえらーになる。
高速な新コンパイラ
Mono > IL > JobComp > DomainModel > Opt > LLVMからExeが出力される
IJobXインターフェース
単体のジョブ、毎フレームExecute関数を実行してくれる。
Scheduleで開始して、JobHandleを返してくるので、次のフレームとかでCompleteでまつ。というのが使い道。
例えばマッシブなアレイのコピーとかを別スレッドに入れることができる。
ネストもか~。
今後、いろんなものがスレッド内で使える様になるぽい。transformはすでに扱える。
IJobParallelForTransformとかがあるぽい。一般化どうなるんだろう。
Jobコンパイラ
ここまではJobシステムの話。
で、新コンパイラのサポートをうけるには、[ComputeJobOptomization(Accuracy, Supprt)]というのを書けばいい。
新Mathライブラリとか
mathf -> mathというのを作ったらしい。
今までのプログラムがどう変わるか
MonoBehaviourで書いてたキューブの回転を変えてみる
どれくらい高速化できるか。
その1
MonoBehaviour大量 -> Managerが単一のMBで一気に回す
その2
TransformAccessArrayというのを使って、ParallelJobで放り込む
これもいいんだけど、作り方を変えてみる
その3
MB -> IComponentBehaviour
ComponentSystemという方を継承して、ComponentArray<ScriptBehaviour>を持たせて、[InjectTuple](全部のInjectTupleAttrがついてる項目をUnionにする
ComponentSystemというのがComponentを放り込んでいい感じに動かしてくれるマネージャ。
その4
Jobにするために、 JobComponentSystemを継承させる。で、これでPararllelForで動かせる様になる。
使い所
距離計算、AI影響マップの生成に使えたりするよ、と。
あとは判定のあるエフェクトとかができそうな気がする。